#include <iostream>

int a[3]={1,2,3}; int n = 3;
int b[3]; //用来存放每次的排列
bool hashTable[3]={false};

//递归调用一般需要传入参数用来迭代，以便达到递归边界结束递归
//index为数组a的下标，最大值为2
void func(int index)
{
    //达到递归边界，做一次操作(一般是结束当前递归)
    if(index==n){
        //说明已排完一趟，输出
        for(int i=0; i<n; i++) {
            printf("%d ",b[i]);
        }
        printf("\n");
        return;
    }

    for(int i=0; i<n; i++) {
        //hashTable是关键，多次递归读取的是同一个hashTable
        if(hashTable[a[i]]==false) {
            //说明本趟循环还没有排过这个数
            b[index] = a[i]; //加入排列
            hashTable[a[i]] = true; //标记为已排列
            func(index+1);// 核心代码，递归处理下一个数
            hashTable[a[i]] = false; //还原状态以便下一次排列
        }
    }
}


int main() {
    func(0); //默认从第一位数开始处理
    return 0;
}